package com.skh.array;

import java.util.Arrays;

/**
 * created by skh on 2019/6/23
 * 238.除自身以外的数组的乘积
 */
public class ProductExceptSelf {

	/*
	给定长度为 n 的整数数组 nums，其中 n > 1，返回输出数组 output ，其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

	示例:

	输入: [1,2,3,4]
	输出: [24,12,8,6]
	说明: 请不要使用除法，且在 O(n) 时间复杂度内完成此题。

	进阶：
	你可以在常数空间复杂度内完成这个题目吗？（ 出于对空间复杂度分析的目的，输出数组不被视为额外空间。）

	 */

	/*
	思路: 每一个数除了它本身所有数的乘积都是他左边数的乘积 乘以 右边数的乘积。

例输入[1,2,3,4] , 左边数乘积n1=[1,1,2,6] ,右边数乘积n2=[1,4,12,24] ,返回结果等于[1*24 , 1*12 , 2*4 , 6*1]。
	 */

	public int[] productExceptSelf(int[] nums) {
		int[] result = new int[nums.length];

		int[] left = new int[nums.length];
		int[] right = new int[nums.length];
		left[0] = 1;
		right[0] = 1;
		for (int i = 0; i < nums.length-1; i++) {
			left[i+1] = nums[i]*left[i];
			right[i+1] = nums[nums.length-1-i]*right[i];
		}

		for (int i = 0; i < nums.length; i++) {
			result[i] = left[i]*right[nums.length-1-i];
		}

		return result;
	}

	public static void main(String[] args) {
		ProductExceptSelf productExceptSelf = new ProductExceptSelf();
		int[] ints = {1,2,3,4};

		int[] ints1 = productExceptSelf.productExceptSelf(ints);
		System.out.println("ints1 = " + Arrays.toString(ints1));
	}
}
